home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / gfx / show / jpegAGAsrc21.lha / jpegAGAsrc / jpegAGA / scalefit.c < prev   
C/C++ Source or Header  |  1995-01-14  |  4KB  |  181 lines

  1. /* Find best scale to fit on the screen */
  2. /* written by Günther Röhrich */
  3. /* for jpegAGA 2.0 */
  4.  
  5.  
  6. #ifndef __GNUC__
  7. #include <pragmas/graphics_pragmas.h>
  8. #include <pragmas/exec_pragmas.h>
  9. #include <clib/graphics_protos.h>
  10. #include <clib/exec_protos.h>
  11. #else
  12. #include <inline/graphics.h>
  13. #include <inline/exec.h>
  14. #endif
  15.  
  16. #include <graphics/modeid.h>
  17.  
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include "jpeglib.h"
  21.  
  22. #define HAM8 1
  23. #define TOLERANCE 35
  24.  
  25. struct WBFlags
  26. {
  27.  int scale;
  28.  short VGAenable;
  29.  short SUPER72enable;
  30.  short SMRenable;
  31.  short GrayEnable;
  32.  short NoSmooth;
  33.  short DCTFast;
  34.  short ScaleFit;
  35. };
  36.  
  37. extern struct WBFlags WBFlags;
  38.  
  39. extern struct GfxBase *GfxBase;
  40.  
  41. ULONG ScaleFitDisplayID=0;
  42.  
  43. int FindScaleFit(JDIMENSION width, JDIMENSION height, ULONG Mode)
  44. {
  45.  struct DimensionInfo querydims;
  46.  ULONG MyDisplayID, NoSUPER72;
  47.  JDIMENSION scrwidth, scrheight;
  48.  JDIMENSION VGAwidth, VGAheight;
  49.  int scale;
  50.  
  51.  ScaleFitDisplayID = 0;
  52.  
  53.  if(!GfxBase)
  54.  {
  55.    if(!(GfxBase = (struct GfxBase *)OpenLibrary((UBYTE *)"graphics.library",39)))
  56.    {
  57.      printf("Could not open graphics.library V39 or higher.\n");
  58.      return -1;
  59.    }
  60.  }
  61.  
  62.  /* check if SUPER72 mode is available */
  63.  
  64.  NoSUPER72 = ModeNotAvailable(SUPER72_MONITOR_ID | SUPERHAMLACE_KEY);
  65.  
  66.  
  67.  MyDisplayID = HIRESLACE_KEY;
  68.  
  69.  if(WBFlags.VGAenable)
  70.  {
  71.    if(ModeNotAvailable(VGAPRODUCT_KEY))
  72.    {
  73.      return -1;
  74.    }
  75.    else
  76.    {
  77.      if(GetDisplayInfoData(NULL, (UBYTE *)&querydims, sizeof(querydims),DTAG_DIMS,VGAPRODUCT_KEY))
  78.      {
  79.        /* allow 10 pixels tolerance */
  80.        VGAwidth  = (JDIMENSION)querydims.StdOScan.MaxX+TOLERANCE;
  81.        VGAheight = (JDIMENSION)querydims.StdOScan.MaxY+TOLERANCE;
  82.      }
  83.    }
  84.  
  85.    MyDisplayID = VGAPRODUCT_KEY;
  86.    if(WBFlags.SUPER72enable && !NoSUPER72) MyDisplayID = SUPER72_MONITOR_ID | SUPERLACE_KEY;
  87.  }
  88.  
  89.  if(GetDisplayInfoData(NULL, (UBYTE *)&querydims, sizeof(querydims),DTAG_DIMS,MyDisplayID))
  90.  {
  91.    /* allow 34 pixels tolerance */
  92.    scrwidth  = (JDIMENSION)querydims.StdOScan.MaxX+TOLERANCE;
  93.    scrheight = (JDIMENSION)querydims.StdOScan.MaxY+TOLERANCE;
  94.    /* printf("Screen width:  %d, height: %d\n", scrwidth-TOLERANCE+1, scrheight-TOLERANCE+1); */
  95.    /* printf("Picture width: %d, height: %d\n", width, height); */
  96.    /* printf("VGA width:     %d, height: %d\n", VGAwidth-TOLERANCE+1, VGAheight-TOLERANCE+1); */
  97.  }
  98.  else return -1;
  99.  
  100.  for(scale=1; scale<8; scale = scale<<1)
  101.  {
  102.    if((width / scale <= scrwidth) && (height / scale <= scrheight)) break;
  103.  }
  104.  
  105.  /* Find the right screenmode */
  106.  
  107.  
  108.  /* SUPER72 is the default, when available */
  109.  
  110.  if(WBFlags.SUPER72enable && !NoSUPER72 && WBFlags.VGAenable)
  111.  {
  112.    if(Mode == HAM8)
  113.    {
  114.      ScaleFitDisplayID = SUPER72_MONITOR_ID | SUPERHAMLACE_KEY;
  115.    }
  116.    else
  117.    {
  118.      ScaleFitDisplayID = SUPER72_MONITOR_ID | SUPERLACE_KEY;
  119.    }
  120.  }
  121.  
  122.  
  123.  /* Check for fit on a VGA screen */
  124.  
  125.  if(WBFlags.VGAenable)
  126.  {
  127.    /* check for fit on a LORES screen */
  128.    if((VGAwidth / 2 >= width / scale) && (VGAheight / 2 >= height / scale))
  129.    {
  130.      if(Mode == HAM8)
  131.      {
  132.        ScaleFitDisplayID = VGALORESHAMDBL_KEY;
  133.      }
  134.      else
  135.      {
  136.        ScaleFitDisplayID = VGALORESDBL_KEY;
  137.      }
  138.    }
  139.    else if((VGAwidth >= width / scale) && (VGAheight >= height / scale) || !WBFlags.SUPER72enable)
  140.    {
  141.      if(Mode == HAM8)
  142.      {
  143.        ScaleFitDisplayID = VGAPRODUCTHAM_KEY;
  144.      }
  145.      else
  146.      {
  147.        ScaleFitDisplayID = VGAPRODUCT_KEY;
  148.      }
  149.    }
  150.  }
  151.  
  152.  if(ScaleFitDisplayID == 0)
  153.  {
  154.    /* check for fit on a LORES screen */
  155.    if((scrwidth / (scale * 2) >= width) && (scrheight / (scale * 2) >= height))
  156.    {
  157.      if(Mode == HAM8)
  158.      {
  159.        ScaleFitDisplayID = HAM_KEY;
  160.      }
  161.      else
  162.      {
  163.        ScaleFitDisplayID = LORES_KEY;
  164.      }
  165.    }
  166.    else
  167.    {
  168.      if(Mode == HAM8)
  169.      {
  170.        ScaleFitDisplayID = HIRESHAMLACE_KEY;
  171.      }
  172.      else
  173.      {
  174.        ScaleFitDisplayID = HIRESLACE_KEY;
  175.      }
  176.    }
  177.  }
  178.  
  179.  return scale;
  180. }
  181.